package com.example.shopping.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;


/**
 * Shiro的配置类
 * @author
 *设置登录权限
 */
@Configuration
public class ShiroConfig {

	/**
	 * 创建ShiroFilterFactoryBean
	 */
	@Bean
	public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){
		ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
		//设置安全管理器
		shiroFilterFactoryBean.setSecurityManager(securityManager);

		//添加Shiro内置过滤器,对网页进行拦截
		/**
		 * Shiro内置过滤器，可以实现权限相关的拦截器
		 *    常用的过滤器：
		 *       anon: 无需认证（登录）可以访问
		 *       authc: 必须认证才可以访问
		 *       user: 如果使用rememberMe的功能可以直接访问
		 *       perms： 该资源必须得到资源权限才可以访问
		 *       role: 该资源必须得到角色权限才可以访问
		 */
		Map<String,String> filterMap = new LinkedHashMap<String,String>();
		/**
		 * 测试1.访问登录页面点击新增与修改发现不能跳转了，代表shiro已经开始拦截验证
		 * 	     观察url地址栏定位在login.jsp表示需要登录才能访问
		 * */
		/*表示发送add请求必须通过验证才可访问*/
//		filterMap.put("/add", "authc");
//		/*表示发送update请求必须通过验证才可访问*/
//		filterMap.put("/update", "authc");

		/**
		 * 测试2.因为上面未提供Login.jsp页面所以报错，现在调整跳转页面
		 * */
		//修改调整的登录页面
//		shiroFilterFactoryBean.setLoginUrl("/login.html");
//		shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);

		/**
		 * 测试3.整个项目所以位置都要验证
		 * */
		//修改调整的登录页面
		//shiroFilterFactoryBean.setLoginUrl("/login.html");
		//放行testThymeleaf与login请求
	//	filterMap.put("/loginUser", "anon");
		//拦截所有请求
		//filterMap.put("/*", "authc");


		shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
		return shiroFilterFactoryBean;
	}

	/**
	 * 创建DefaultWebSecurityManager
	 */
	@Bean(name="securityManager")
	public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
		DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
		//关联realm
		securityManager.setRealm(userRealm);
		return securityManager;
	}

	/**
	 * 创建Realm
	 */
	@Bean(name="userRealm")
	public UserRealm getRealm(){
		return new UserRealm();
	}

}
